package com.java.simple.study.jvm.gc.reference;

import com.java.simple.study.tool.Sleeper;
import java.util.Objects;

/**
 * @author zhoujunlin
 * @date 2022年10月19日 15:03
 * @desc 测试Object类中finalize()方法  即对象的finalization机制
 */
public class CanReliveObj {

    /**
     * 方法区  类变量 是一个GCRoot
     */
    public static CanReliveObj obj;

    /**
     * 此方法只能被调用一次
     * 注释与解开此方法  查看System.gc()效果
     *
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("调用当前类重写的finalize()方法");
        // 当前待回收对象在finalize()方法中与引用链上的一个对象建立了联系
        obj = this;
    }

    public static void main(String[] args) {
        obj = new CanReliveObj();
        // 对象第一次成功拯救自己
        obj = null;
        // 调用垃圾回收器
        System.gc();
        System.out.println("第1次 gc");
        // 因为Finalizer线程优先级很低  暂停2秒去等待它
        Sleeper.sleep(2);
        if (Objects.isNull(obj)) {
            System.out.println("obj is dead");
        } else {
            System.out.println("obj is still alive");
        }
        System.out.println("第2次 gc");
        // 下面这段代码与上面完全相同  但是这次自救缺失败了
        obj = null;
        // 调用垃圾回收器
        System.gc();
        // 因为Finalizer线程优先级很低  暂停2秒去等待它
        Sleeper.sleep(2);
        if (Objects.isNull(obj)) {
            System.out.println("obj is dead");
        } else {
            System.out.println("obj is still alive");
        }
    }

}
